package Day_0130;

import java.util.*;

/**
 * @author zxc
 * @date 2023/01/30 17:08
 **/
public class HashMapAndHashTable {
    public static void main(String[] args) {
        /**
         * HashMap和HashTable的区别 ：
         * 1、两者父类不同
         * （1）不同点 ：HashMap是继承自AbstractMap类，而Hashtable是继承自Dictionary类。
         * （2）共同点 ：不过它们都实现了同时实现了map、Cloneable（可复制）、Serializable（可序列化）这三个接口。
         *
         * 2、对外提供的接口不同
         * Hashtable比HashMap多提供了elments() 和contains() 两个方法。
         * （1）elments() 方法继承自Hashtable的父类Dictionnary。
         * ===》 elements() 方法用于返回此Hashtable中的value的枚举。
         * （即，调用Hashtable中的elements()方法能够返回所有value）
         * （2）contains()方法判断该Hashtable是否包含传入的value。
         * 事实上，contansValue() 就只是调用了一下contains() 方法。
         *
         * 3、对null的支持不同
         * （1）Hashtable：key和value都不能为null。
         * （2）HashMap：key可以为null，value可以为null。
         * 为保证key的唯一性，即key为null有且只能够存在一个;
         * 可以有多个key值对应的value为null。
         *
         * 4、安全性不同
         * （1）HashMap是线程不安全的，在多线程并发的环境下，可能会产生死锁等问题。
         * （即，HashMap的使用场景大多数为单线程情况下）
         * 虽然HashMap是线程不安全的，但是它的效率远远高于Hashtable，这样设计是合理的，因为大部分的使用场景都是单线程。
         *
         * 注意 ：ConcurrentHashMap类来保证线程安全;
         * （锁机制 ：即同一时刻，只能够有一个线程来访问共享资源）
         * 当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。
         * ConcurrentHashMap虽然也是线程安全的，但是它的效率比Hashtable要高好多倍。
         * 因为ConcurrentHashMap使用了分段锁，并不对整个数据进行锁定。
         *（2）Hashtable是线程安全的，它的每个方法上都有synchronized 关键字，因此可直接用于多线程中。
         * ===》 Hashtable，使用sychronized关键字修饰每个方法，来保证线程安全;
         *
         * 5、初始容量大小和每次扩充容量大小不同
         *
         * 6、计算hash值的方法不同
         *
         */
        HashMap<Integer , Integer> hashMap = new HashMap<>();
        Hashtable<Integer , Integer> hashtable = new Hashtable<>();
    }
}
